package ch3.Singleton;

/**
 * 基于双重检查锁定的正确单例模式实现
 * 使用volatile关键字修饰instance，保障有序性（对instance的创建过程不会重排序）
 */

public class DCLSingleton {

    private static volatile DCLSingleton instance = null;

    private DCLSingleton() {}

    // 创建并返回该类的唯一实例
    public static DCLSingleton getInstance() {
        if (null == instance) {   // 操作1
            synchronized (DCLSingleton.class) {
                if (null == instance) {  // 操作2
                    instance = new DCLSingleton();  // 操作3
                }
            }
        }
        return instance;
    }
}
